# -*- coding: utf-8 -*-
"""
中性策略框架 | 邢不行 | 2024分享会
author: 邢不行
微信: xbx6660
"""
from Config import back_test_path
import ccxt
from Functions import *
from Evaluate import *
import time

'''
对比步骤
回测数据准备
1.从官网上下载一份最新的币种K线数据
2.修改config的end_time尽量为数据最新的时间
3.运行1号脚本和2号脚本得到策略选币结果和资金曲线

实盘数据准备
4.将服务器上的选币文件和资金曲线文件保存至本地
5.将保存至本地的数据路径在脚本中进行配置

运行脚本进行对比
6.选币对比：
    6.1一次只能对比一个offset的回测选币
    6.2确保进行对比的策略是一致的
    6.3如果出现不一致的情况，可以先检查一下配置是否一致(比如选币数量、持仓周期等，以及非常重要的黑名单币种)
7.资金曲线对比
    7.1回测为单offset资金曲线，实盘多offset混合的资金曲线，有一定差异是正常的，但差异不能过大
    7.2即便实盘跑的是单offset的策略，也无法做到实盘和回测的资金曲线完全一致，走势一致即可
'''

# =路径配置
strategy_name = 'Strategy_QuoteVolumeMean'  # 指定策略名
data_path = 'D:/pythonproject/coin/中性策略框架2.1.9/中性策略框架/中性策略实盘框架/data'  # 指定实盘的data文件夹路径
account_name = '账户1'  # 指定账户名

# =参数配置
n = 10  # 选币对比周期数。从回测数据中最新的时间开始对比，对比多少个周期
start_time = '2024-04-01'  # 资金曲线对比开始时间
end_time = None  # 资金曲线对比截止时间。可以为None，代表不设置截止时间
# 配置api获取转账记录
proxy = {}
# proxy = {'http': 'http://127.0.0.1:7890', 'https': 'http://127.0.0.1:7890'}
exchange_basic_config = {
    'apiKey': '',
    'secret': '',
    'timeout': 30000,
    'rateLimit': 10,
    'enableRateLimit': True,
    'options': {
        'adjustForTimeDifference': True,
        'recvWindow': 50000,
    },
    'proxies': proxy,
    'is_pure_long': False
}
# 获取对应账户的配置
exchange = ccxt.binance(exchange_basic_config)

# 动态读取config里面配置的strategy_name脚本
Strategy = __import__('strategy.%s' % strategy_name, fromlist=('',))
# 获取Strategy的hold_period，后续使用
hold_period = Strategy.hold_period
# 获取Strategy的if_use_spot
if_use_spot = Strategy.if_use_spot
# 获取Strategy的offset
offset = Strategy.offset
# 定义label变量
label = 'SPOT' if if_use_spot else 'SWAP'

# =====获取当前服务器时区，距离UTC 0点的偏差
utc_offset = int(time.localtime().tm_gmtoff / 60 / 60)  # 如果服务器在上海，那么utc_offset=8

# 指定回测和实盘选币的路径。回测选币路径：2号脚本保存下来的选币结果文件；实盘选币路径：从服务器上下载下来并保存至对应实盘select_coin文件夹中的选币
test_select_coin = os.path.join(back_test_path, f"{strategy_name.split('Strategy_')[1]}_{label}_选币结果_{hold_period}_{offset}.csv")  # 回测选币数据
real_select_coin = os.path.join(data_path, account_name, 'select_coin/')  # 实盘选币数据(需要从服务器上下载下来)

# 指定回测和实盘资金曲线的路径。回测资金曲线路径：2号脚本保存的资金曲线文件；实盘资金曲线路径：从服务器上下载下来的账户信息文件夹
test_curve = os.path.join(back_test_path, f"{strategy_name.split('Strategy_')[1]}_{label}_资金曲线_{hold_period}_{offset}.csv")  # 回测资金曲线
real_curve = os.path.join(data_path, account_name, '账户信息/equity.csv')  # 实盘资金曲线(需要从服务器上下载下来)

# 选币对比
select_coin_compare(test_select_coin, real_select_coin, offset, n, hold_period)

# 资金曲线对比
curve_compare(exchange, real_curve, test_curve, data_path, account_name, utc_offset, start_time, end_time, root_path)
